/**
 * currying 又称部分求值.
 * 一个 currying 的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求职,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来.
 * 带到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值.
 */
var currying = function (fn) {
    var args = [];

    return function () {
        if (arguments.length == 0) {
            return fn.apply(this, args);
        } else {
            [].push.apply(args, arguments);
            // 递归函数必须能够引用它本身。很典型的，函数通过自己的名字调用自己。然而，匿名函数 (通过 函数表达式 或者 函数构造器 创建) 没有名称。因此如果没有可访问的变量指向该函数，唯一能引用它的方式就是通过 arguments.callee。
            return arguments.callee;
        }
    }
}
var cost = (function () {
    var money = 0;

    return function () {
        for (var i = 0, l = arguments.length; i < l; i++) {
            money += arguments[i];
        }
        return money;
    }
})();
var cost = currying(cost);

cost(100); // 未求值
cost(200); // 未求值
cost(300); // 未求值

console.log(cost());// 求职并输入

